package com.cskaoyan.javase.oop1._13block._3static.classload;
/**
 * 类加载
 * 加载 ---> 连接 ---> 初始化
 * 类加载的连环触发
 * 实际上是类的初始化步骤的连环触发
 * 加载和连接都已经事先完成了
 *
 *
 * 在这个案例中,Demo2率先开始类初始化
 * Cat类开始进行初始化
 * Dog类最后开始进行初始化
 *
 * 在Dog类进行初始化的过程中,Demo2,Cat,Dog三个类都已经完成了加载和连接,并且初始化的步骤三个类都已经开始,不会再触发初始化了
 * 所以都可以直接创建它们的对象了
 *
 * 最先初始化完成Dog类,在这个过程中,需要创建Dog类对象和Demo2对象,依次输出:
 * dog
 * demo2
 * 创建完这两个对象后,初始化Dog类结束
 *
 * 于是接下来完成Cat类的初始化
 * 于是再次创建Dog对象
 * 程序输出:
 * dog
 *
 * Dog对象创建完毕,Cat类的初始化就结束了
 *
 * 于是开始完成Demo2的类初始化,创建Cat对象
 * 程序输出:
 * cat
 * 创建Cat对象结束后,Demo2类的初始化就结束了
 *
 * 整个程序的类加载就全部结束了.
 *
 * @since 11:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    // 静态成员变量的显式赋值
    static Cat cat = new Cat();

    static {
        System.out.println("Demo2类结束初始化步骤了!");
    }
    /*
        这里需要创建Dog对象
        Dog类已经完成加载和连接了
        并且Dog类的初始化已经开始了,不会再次初始化了

        总之可以直接创建Dog对象
     */
    Dog dog = new Dog();

    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo2 d = new Demo2();
    }

    public Demo2() {
        System.out.println("demo2");
    }
}

class Cat {


    static Dog dog = new Dog();
    static {
        System.out.println("Cat类结束初始化步骤了!");
    }

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    /*static {
        System.out.println("Dog类开始初始化步骤了!");
    }*/
    /*
        在这里创建Demo2对象时,该类已经完成加载和连接了,正在初始化的过程中
        所以该类对象已经能够创建了
        并且初始化步骤一个类最多只有一次,不会再次初始化它了

        不会出现循环"类加载"的情况
     */
    static Demo2 demo = new Demo2();
    static {
        System.out.println("Dog类结束初始化步骤了!");
    }

    public Dog() {
        System.out.println("dog");
    }
}